package com.more.offer.util;

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
 * @author pinoc
 * @date 2023/6/20
 */
public class ImgUtil {
	public static String merge(String backGroundImageUrl, String qrCodeUrl, String imageName, String title) {
		// 添加字体的属性设置
		Font font = new Font("黑体", Font.BOLD, 50);
		try {
			//加载背景图片(也就是模板图)
			BufferedImage backGroundImage = ImageIO.read(new File(backGroundImageUrl));
			//加载二维码图片(也就是需要合成到模板图上的图片)
			BufferedImage imageCode = ImageIO.read(new File(qrCodeUrl));
			//把背景图片当做为模板
			Graphics2D graphics = backGroundImage.createGraphics();
			//在模板上绘制图象(需要绘图的图片,左边距,上边距,图片宽度,图片高度,图像观察者)同一个模板一般是不会变的
			graphics.drawImage(imageCode, 520, 800, 210, 210, null);
			//设置字体
			graphics.setFont(font);
			//设置颜色
			graphics.setColor(Color.BLACK);
			//获取字体度量(字体度量是指对于指定字号的某种字体，在度量方面的各种属性)
			FontMetrics fontMetrics = graphics.getFontMetrics(font);
			//获取字体度量的宽度
			int textWidth = fontMetrics.stringWidth(title);
			//左边距=(模板图宽度-文字宽度)/2
			int widthX = (backGroundImage.getWidth() - textWidth) / 2;
			//g.drawString(title, 820, 2850);
			//绘制文字(内容，左边距,上边距)，同一个模板上边距一般也是不变的
			graphics.drawString(title, widthX, 1000);
			//完成模板修改
			graphics.dispose();
			//获取新文件的地址
			File outPutFile = new File(imageName);
			//生成新的合成过的用户二维码并写入新图片,指定类型为png
			ImageIO.write(backGroundImage, "png", outPutFile);
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 返回给页面的图片地址(因为绝对路径无法访问)
		return imageName;
	}

	public static void makePoster(){
		//待返回的 BufferedImage对象，如果你想返回其他的也很方便
		BufferedImage poster = null;
		//海报尺寸 //本身的模板的尺寸，这个是固定值
		int width = 634;
		int height = 1084;

		//二维码尺寸，长宽相等
		int qrcodeWidth = 120;

		//头像尺寸，长宽相等
		int headImgWidth = 70;

		//团长icon标尺寸
		int headFlagWidth = 68;

		try {
			//这里制作一个文字图片，因为文字有特殊的字体和字号
//			BufferedImage textIMg = getTextMark4Poster();
			//获取文字图片的宽度
//			int textWidth = textIMg.getWidth();

			//这里获取一些模板、二维码、头像
			//目前是测试，发布后头像和二维码应该是外部获取的
			//因为是springboot 打jar包发布的，所以是这样获取jar包里的图片
			String imagePath = "F:\\downloads\\imgBuild\\1.jpg";
			//保存生成图片路径
			String genePath = "F:\\downloads\\imgBuild\\4.jpg";
			String qrCode = "F:\\downloads\\imgBuild\\2.jpg";
			//模板大图
			Thumbnails.of(imagePath)
					//读取二维码，并且设置在指定的位置
					.watermark(new CustomPosition(width/2-qrcodeWidth/2, 600)
							, ImageIO.read(new File(qrCode)), 1f)
					//设置文字
//					.watermark(new FreePositionsThumbnails(width/2-textWidth/2,715)
//							, textIMg,1f)
					//压缩比
					.scale(1.0f)
					//转成图片

					.toFile(genePath);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static BufferedImage getTextMark4Poster() throws IOException, FontFormatException {
		String text = "尹鹏的3人团";
		//先绘制一张空白文字的图片，用于计算文字的大小
		BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
		Graphics2D g2d = img.createGraphics();

		Resource r = new PathMatchingResourcePatternResolver().getResource("fonts" + File.separator + "SourceHanSansCN-Medium.otf");

		Font font = Font.createFont(Font.TRUETYPE_FONT, r.getInputStream()).deriveFont(24f);

		//Font font = new Font("Arial", Font.PLAIN, 12);
		g2d.setFont(font);
		FontMetrics fm = g2d.getFontMetrics();
		int width = fm.stringWidth(text);
		int height = fm.getHeight();
		g2d.dispose();

		//这张图片是最终生成的文字图片
		img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
		g2d = img.createGraphics();
		//g2d.setColor(Color.RED);
		//g2d.fillRect(0, 0, width, height);

		//KEY_ALPHA_INTERPOLATION  代表 alpha 合成微调的键，该微调可能的值有 VALUE_ALPHA_INTERPOLATION_SPEED（追求速度）、VALUE_ALPHA_INTERPOLATION_QUALITY（追求质量）和VALUE_ALPHA_INTERPOLATION_DEFAULT，代表平台缺省值。
		g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION,RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);

		//KEY_ANTIALIASING 决定是否使用抗锯齿。当着色有倾斜角度的线时，通常会得到一组阶梯式的像素排列，使这条线看上去不平滑，经常被称为 锯齿状图形。
		// 抗锯齿是一种技术，它设置有倾斜角度的线的像素亮度，以使线看起来更平滑。因此，这个微调是用来决定在着色有倾斜角度的线时是否在减少锯齿状图形上花费时间。
		// 可能的值有 VALUE_ANTIALIAS_ON（使用抗锯齿）、VALUE_ANTIALIAS_OFF（不使用抗锯齿） 和 VALUE_ANTIALIAS_DEFAULT（默认的抗锯齿）。
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

		//KEY_COLOR_RENDERING 控制颜色着色的渲染方式。可能的值有 VALUE_COLOR_RENDER_SPEED（追求速度）VALUE_COLOR_RENDER _QUALITY（追求质量） 和 VALUE_COLOR_RENDER_DEFAULT（默认）。
		g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING,RenderingHints.VALUE_COLOR_RENDER_QUALITY);

		//KEY_DITHERING 控制如何处理抖动。抖动是用一组有限的颜色合成出一个更大范围的颜色的过程，方法是给相邻像素着色以产生不在该组颜色中的新的颜色幻觉。可能的值有 VALUE_DITHER_ENABLE（不抖动）、VALUE_DITHER _DISABLE （抖动）和 VALUE_DITHER_DEFAULT（默认）。
		g2d.setRenderingHint(RenderingHints.KEY_DITHERING,RenderingHints.VALUE_DITHER_ENABLE);

		//KEY_FRACTIONALMETRICS  字体规格。可能的值有 VALUE_FRACTIONALMETRICS_ON（启用字体规格）、VALUE_FRACTIONALMETRICS_OFF（禁用字体规格） 和VALUE_FRACTIONALMETRICS _DEFAULT（默认）。
		g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);

		//KEY_RENDERING 确定着色技术，在速度和质量之间进行权衡。可能的值有 VALUE_RENDERING_SPEED（追求速度）、VALUE_RENDERING _QUALITY（追求质量） 和VALUE_RENDERING_DEFAULT（默认）。
		g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

		//KEY_STROKE_CONTROL 笔划规范化控制，可能有的值有VALUE_STROKE_NORMALIZE、VALUE_STROKE_PURE和VALUE_STROKE_DEFAULT
		g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
		g2d.setFont(font);
		fm = g2d.getFontMetrics();
		g2d.setColor(Color.BLACK);
		g2d.drawString(text, 0, fm.getAscent());
		g2d.dispose();

		return img;

	}

	public static void main(String[] args) throws IOException {
		/*//生成Alian.png的二维码图片(去除白边)
		String qrCodeUrl = "F:\\downloads\\imgBuild\\2.jpg";
		String backGroundUrl = "F:\\downloads\\imgBuild\\1.jpg";
		String imageName = "F:\\downloads\\imgBuild\\3.jpg";
		//图片上的标签绘制
		String title = "扫码参与活动";
		System.out.println("要添加的文字信息：" + title);
		//合成图片
		merge(backGroundUrl, qrCodeUrl, imageName, title);
		System.out.println("合成图片完成：" + imageName);*/

		//图片路径
		String imagePath = "F:\\downloads\\imgBuild\\1.jpg";
		//保存生成图片路径
		String genePath = "F:\\downloads\\imgBuild\\111.jpg";
		//将指定文件压缩后 放置到指定路径下
		//下面是一些常用的方法展示
		Thumbnails.of(imagePath)
				//按比例放大缩小  >0   cale(scaleWidth,scaleHeight)
//				.scale(0.8f)
				//设置生成图片的长宽 与scale 不能同时使用
				.size(1000, 2047)
				// rotate(角度),正数：顺时针负数：逆时针
				.rotate(0)
				//.watermark(，水印图，透明度)
				.watermark(Positions.BOTTOM_RIGHT,
						ImageIO.read(new File("F:\\downloads\\imgBuild\\2.jpg")),
						1f)
				//保存为文件的格式设置
				.outputFormat("jpg")
				//是否允许覆盖已存在的文件
				.allowOverwrite(true)
				//输出的图片质量  0~1 之间,否则报错
				.outputQuality(0.5f)
//                .toOutputStream(new FileOutputStream("url"))   //输出到指定的输出流中
				// //asBufferedImage()返回BufferedImage  ImageIO.write(thumbnail,"jpg",newFile("c:/a380_1280x1024_BufferedImage.jpg"));
//                .asBufferedImages()
				.toFile(genePath);

//		makePoster();
	}


}
